package br.com.sgpv2.controler.evento;

import java.util.List;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import br.com.sgpv2.controler.SGPController;
import br.com.sgpv2.entity.JsonResponse;
import br.com.sgpv2.entity.evento.Evento;
import br.com.sgpv2.entity.evento.TipoEventoEnum;
import br.com.sgpv2.service.entidade.EntidadeService;
import br.com.sgpv2.service.evento.EventoService;


/**
 * Handles requests for the application /evento.
 */

@Controller
public class EventoController extends SGPController {
	
	@Autowired
	private EventoService eventoService;
	
	@Autowired
	private EntidadeService entidadeService;
	
	/**
	 * Página de eventos - acessado pelo procurar.
	 * @throws Exception.
	 */
	@RequestMapping(value = "/eventos", method = RequestMethod.POST)
	public String eventos(@RequestParam String descricao, Locale locale, Model model) throws Exception {
		
		return listar(descricao, locale, model);
	}
	
	/**
	 * Página de eventos - Acessada pelo menu.
	 * @throws Exception.
	 */
	@RequestMapping(value = "/eventos", method = RequestMethod.GET)
	public String eventos(Locale locale, Model model) throws Exception {
		
		return listar(null, locale, model);
	}
	
	private String listar(String descricao, Locale locale, Model model) {
		List<Evento> eventos = eventoService.consultarPorDescricao(descricao);

		configurarPaginacao(eventos, model);
		model.addAttribute("eventos", getPagedListHolder().getPageList());
		
		return "eventos";
	}
	
	/**
	 * avança para página de inclusão de evento.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/evento/salvar", method = RequestMethod.GET)
	public String salvar(Model model) throws Exception {
	
		model.addAttribute("tipoEvento",TipoEventoEnum.values());
		model.addAttribute("evento", new Evento());
		
		return "evento_incluir";		
	}
	
	/**
	 * inclui um evento no sistema.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/evento/salvar", method = RequestMethod.POST)
	public String salvar(@ModelAttribute Evento evento, Model model, BindingResult result) throws Exception {
				
		if(evento != null){
			evento.setEntidade(entidadeService.buscarEntidade());
			if(evento.getPercentualTransiente() != null && !evento.getPercentualTransiente().isEmpty()){
				evento.setPercentual(transformStringToDouble(evento.getPercentualTransiente()));
			}			
			eventoService.salvar(evento);
		}
		return "redirect:../eventos";
	}
	
	/**
	 * avança para página de alteração de evento.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/evento/alterar/{pk}", method = RequestMethod.GET)
	public String getAlterar(@PathVariable Integer pk, Model model) throws Exception {
		Evento eventoAlteracao = eventoService.buscar(pk);
		if(eventoAlteracao != null){
			if(eventoAlteracao.getPercentual() != null){
				eventoAlteracao.setPercentualTransiente(eventoAlteracao.getPercentual().toString());
			}			
			
			model.addAttribute("evento",eventoAlteracao);			
			model.addAttribute("tipoEvento",TipoEventoEnum.values());
			return "evento_alterar";
		}else{
			return "redirect:../eventos";
		}		
	}
	
	/**
	 * avança para página de alteração de evento.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/evento/alterar", method = RequestMethod.POST)
	public String alterar(@ModelAttribute Evento evento, Model model, BindingResult result) throws Exception {
			
		if(evento != null){
			evento.setEntidade(entidadeService.buscarEntidade());
			if(evento.getPercentualTransiente() != null && !evento.getPercentualTransiente().isEmpty()){
				evento.setPercentual(transformStringToDouble(evento.getPercentualTransiente()));			
			}		
				
			eventoService.alterar(evento);
		}
		return "redirect:../eventos";
	}
	
	/**
	 * Exclui um evento.
	 * @throws Exception 
	 */
	@RequestMapping(value = "/evento/excluir/{pk}", method = RequestMethod.GET)
	public String excluir(@PathVariable Integer pk, Model model) throws Exception {
		Evento eventoExclusao = eventoService.buscar(pk);
		
		if(eventoExclusao !=null){
			eventoService.excluir(eventoExclusao);
		}
		
		return "redirect:/eventos";
	}
	
	/**
	 * Valida a exclus�o de um evento.
	 * @throws Exception 
	 */
	@ResponseBody
	@RequestMapping(value = "/evento/validarExclusao/{idEvento}", method = RequestMethod.GET)
	public JsonResponse validarExclusao(@PathVariable String idEvento, Model model) throws Exception {		
		JsonResponse jsonResponse = new JsonResponse();
		jsonResponse.setSuccess(eventoService.validarExclusao(idEvento));				
		return jsonResponse;
	}
	
	@ResponseBody
	@RequestMapping(value = "/evento/paginacao/{acao}", method = RequestMethod.GET)
	public ModelAndView paginacao(@PathVariable String acao, Model model) throws Exception {		
		navegarPaginacao(acao, model);
		model.addAttribute("eventos", getPagedListHolder().getPageList());
		return new ModelAndView("evento.lista");
	}

}
